package modelLayer;
import java.util.ArrayList;

/**
 * AdresseBog er en container for objekter af klasssen Kunde. Den er lavet i en singleton form, så vi kun
 * har en af den.
 * 
 * @author Gruppe 2
 * @version 1.0
 */
public class AdresseBog
{
    // instance variables - replace the example below with your own
    private ArrayList<Kunde> mineKunder;
    private static AdresseBog instance;

    /**
     * Constructor for objekterne af klassen AdresseBog
     */
    private AdresseBog()
    {
        // initialise instance variables
        mineKunder = new ArrayList<Kunde>();
    }

    /**
     * En metode til at tjekke om en instans af AdresseBog eksistere, hvis ikke bliver en skabt.
     * @return AdresseBog instance.
     */
    public static AdresseBog getInstance()
    {
        if(instance == null)
        {
            instance = new AdresseBog();
        }
        return instance;
    }

    /**
     * En metode for at tilføje objekter af klassen AdresseBog til vores ArrayList mineKunder, har beskyttelse mod
     * tilføjelsen af 2 kunder med samme cpr-nr
     * @param Kunde k
     */
    public void addKunde(Kunde k)
    {
        if(checkForCprNr(k) == false)
        {
            mineKunder.add(k);
        }
        else
        {
            System.out.println("Du kan ikke tilføje 2 kunder med samme cprnr");
        }

    }

    /**
     * En metode skabt til at finde specifikke kunder i vores ArrayList mineKunder, 
     * bliver brugt i de fleste af vores metoder
     * @param String cprNr
     * @return Kunde k
     */
    public Kunde findKunde(String cprNr)
    {
        int index = 0;
        boolean searching = true;
        while(searching == true && mineKunder.size()>index)
        {
            Kunde k = mineKunder.get(index);
            if(k.getCprNr().equals(cprNr))
            {
                searching = false;
            }
            else
            {
                index++;
            }
        }
        if(!searching)
        {
            return mineKunder.get(index);
        }
        else
        {
            return null;
        }
    }

    /**
     * En metode til at opdatere AdresseBog, bruger try and catch til at beskytte mod forsøg på at opdatere objekter
     * som ikke eksistere
     * @param String cprNr
     * @param String nyCprNr
     * @param String navn
     * @param String adresse
     * @param int postNr
     * @param String by
     * @param String telefon
     * @return boolean opdaterKunde
     */
    public boolean opdaterKunde(String cprNr, String nyCprNr, String navn, String adresse, int postNr, String by, String telefon)
    {

        boolean opdaterKunde = false;
        while(opdaterKunde == false)
        {
            try
            {
                Kunde k = findKunde(cprNr);
                k.setCprNr(nyCprNr);
                k.setNavn(navn);
                k.setAdresse(adresse);
                k.setPostNr(postNr);
                k.setBy(by);
                k.setTelefon(telefon);
                opdaterKunde = true;
            }
            catch (Exception opdaterKunder)
            {
                System.out.println("Kunne ikke finde personen - prøv andet cprnr");
                opdaterKunde = true;
            }
        }

        return opdaterKunde;
    }

    /**
     * En metode til at slette AdresseBog, bruger try and catch til at beskytte mod forsøg på at opdatere objekter
     * som ikke eksistere
     * @param String cprNr
     * @return boolean sletKunde
     */
    public boolean sletKunde(String cprNr)
    {
        boolean sletKunde = false;
        while(sletKunde == false)
        {
            try
            {
                Kunde k = findKunde(cprNr);
                mineKunder.remove(k);
                sletKunde = true;
            }
            catch (Exception sletKunder)
            {
                System.out.println("Kunne ikke finde personen - prøv andet cprnr");
                sletKunde = true;
            }   
        }
        return sletKunde;
    }

    /**
     * Denne metode printer alle objekter af Kunde objektet af AdresseBog.
     */
    public ArrayList<String> printAdresseBog()
    {
        ArrayList<String> print = new ArrayList<String>();
        for(Kunde k : mineKunder)
        {
            print.add("CPR nummer: " + k.getCprNr());
            print.add("\n");
            print.add("Navn: " + k.getNavn());
            print.add("\n");
            print.add("Adresse " + k.getAdresse() + ", " + k.getPostNr() + " " + k.getBy());
            print.add("\n");
            print.add("telefon: " + k.getTelefon());
        }
        return print;
    }

    /**
     * En metode some tjekker om en kunde med samme cprnr allerede findes i vores ArrayList
     * hvis den finder en udksriver den en besked om at man ikke kan tilføje 2 med samme.
     * @param Kunde k
     * @return boolean found
     */
    public boolean checkForCprNr(Kunde k)
    {
        boolean found = false;
        int index = 0;
        while(index < mineKunder.size())
        {
            Kunde kCpr = mineKunder.get(index);
            if(k.getCprNr() != kCpr.getCprNr())
            {
                found = false;
                index++;
            }
            else
            {
                found = true;
                index++;
            }
        }
        return found;
    }
}

